/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import Control.exceptions.NonexistentEntityException;
import Control.exceptions.PreexistingEntityException;
import Entidad.Permisos;
import Entidad.PermisosPK;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidad.Funciones;
import Entidad.Usuario;
import javax.transaction.UserTransaction;

/**
 *
 * @author pepe
 */
public class PermisosJpaController extends GeneralJpaCpontroller<Permisos> implements Serializable {

    public PermisosJpaController() {
       
    }
    
    public void eliminarPermisos(Usuario u  , Funciones f){
        EntityManager em = getEntityManager();
        
        Query q = em.createQuery("DELETE  FROM Permisos p where "+
                "p.usuario = :u AND p.funciones = :f");
        
        try{
            q.setParameter("u", u).setParameter("f", f).getSingleResult();
        }catch(Exception ex ){
            System.out.println(ex);
        }
    }
    
    public Permisos buscarPorUsuarioYFuncion(Usuario u , Funciones f){
        EntityManager em = getEntityManager();
        
        Query q  = em.createQuery("SELECT p FROM Permisos p WHERE"
                + " p.usuario = :u AND p.funciones = :f");
        try{
            return (Permisos) q.setParameter("u", u).setParameter("f", f ).
                    getSingleResult();
            
        }catch(Exception e){
            System.out.println(e);
            return null;
        }
    }
    
    public boolean isFuncion(Usuario u, Funciones f){
        EntityManager em = getEntityManager();
        Query q = em.createQuery("SELECT p FROM Permisos p WHERE "
                + "p.usuario = :u AND p.funciones = :f");
        
        try{
            q.setParameter("u", u).setParameter("f", f ).
                    getSingleResult();
        }catch(Exception e){
            System.out.println(e);
            return false;
        }
        return true;
    }
    
    
    

    public void create(Permisos permisos) throws PreexistingEntityException, Exception {
        if (permisos.getPermisosPK() == null) {
            permisos.setPermisosPK(new PermisosPK());
        }
        permisos.getPermisosPK().setFuncionesId(permisos.getFunciones().getIdFunciones());
        permisos.getPermisosPK().setUsuarioCedula(permisos.getUsuario().getCedula());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Funciones funciones = permisos.getFunciones();
            if (funciones != null) {
                funciones = em.getReference(funciones.getClass(), funciones.getIdFunciones());
                permisos.setFunciones(funciones);
            }
            Usuario usuario = permisos.getUsuario();
            if (usuario != null) {
                usuario = em.getReference(usuario.getClass(), usuario.getCedula());
                permisos.setUsuario(usuario);
            }
            em.persist(permisos);
            if (funciones != null) {
                funciones.getPermisosList().add(permisos);
                funciones = em.merge(funciones);
            }
            if (usuario != null) {
                usuario.getPermisosList().add(permisos);
                usuario = em.merge(usuario);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findPermisos(permisos.getPermisosPK()) != null) {
                throw new PreexistingEntityException("Permisos " + permisos + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Permisos permisos) throws NonexistentEntityException, Exception {
        permisos.getPermisosPK().setFuncionesId(permisos.getFunciones().getIdFunciones());
        permisos.getPermisosPK().setUsuarioCedula(permisos.getUsuario().getCedula());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Permisos persistentPermisos = em.find(Permisos.class, permisos.getPermisosPK());
            Funciones funcionesOld = persistentPermisos.getFunciones();
            Funciones funcionesNew = permisos.getFunciones();
            Usuario usuarioOld = persistentPermisos.getUsuario();
            Usuario usuarioNew = permisos.getUsuario();
            if (funcionesNew != null) {
                funcionesNew = em.getReference(funcionesNew.getClass(), funcionesNew.getIdFunciones());
                permisos.setFunciones(funcionesNew);
            }
            if (usuarioNew != null) {
                usuarioNew = em.getReference(usuarioNew.getClass(), usuarioNew.getCedula());
                permisos.setUsuario(usuarioNew);
            }
            permisos = em.merge(permisos);
            if (funcionesOld != null && !funcionesOld.equals(funcionesNew)) {
                funcionesOld.getPermisosList().remove(permisos);
                funcionesOld = em.merge(funcionesOld);
            }
            if (funcionesNew != null && !funcionesNew.equals(funcionesOld)) {
                funcionesNew.getPermisosList().add(permisos);
                funcionesNew = em.merge(funcionesNew);
            }
            if (usuarioOld != null && !usuarioOld.equals(usuarioNew)) {
                usuarioOld.getPermisosList().remove(permisos);
                usuarioOld = em.merge(usuarioOld);
            }
            if (usuarioNew != null && !usuarioNew.equals(usuarioOld)) {
                usuarioNew.getPermisosList().add(permisos);
                usuarioNew = em.merge(usuarioNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                PermisosPK id = permisos.getPermisosPK();
                if (findPermisos(id) == null) {
                    throw new NonexistentEntityException("The permisos with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(PermisosPK id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            
            
            em = getEntityManager();
            
            em.getTransaction().begin();
            Permisos permisos;
            try {
                permisos = em.getReference(Permisos.class, id);
                permisos.getPermisosPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The permisos with id " + id + " no longer exists.", enfe);
            }
            Funciones funciones = permisos.getFunciones();
            if (funciones != null) {
                funciones.getPermisosList().remove(permisos);
                funciones = em.merge(funciones);
            }
            Usuario usuario = permisos.getUsuario();
            if (usuario != null) {
                usuario.getPermisosList().remove(permisos);
                usuario = em.merge(usuario);
            }
            em.remove(permisos);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Permisos> findPermisosEntities() {
        return findPermisosEntities(true, -1, -1);
    }

    public List<Permisos> findPermisosEntities(int maxResults, int firstResult) {
        return findPermisosEntities(false, maxResults, firstResult);
    }

    private List<Permisos> findPermisosEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Permisos as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Permisos findPermisos(PermisosPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Permisos.class, id);
        } finally {
            em.close();
        }
    }

    public int getPermisosCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Permisos as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
